package proxypattern.entity;

import proxypattern.base.IPersonBean;
import proxypattern.impl.NonOwnerInvocationHandler;
import proxypattern.impl.OwnerInvocationHandler;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**personBean 的代理对象
 * @author yaojianfeng
 */
public class PersonProxy  {
    /**
     * 获取拥有者类的代理对象
     * @param personBean 目标类接口
     * @return 代理类
     */
    public IPersonBean getOwnerProxy(IPersonBean personBean){
        Object o = Proxy.newProxyInstance(
                //目标类的类加载器当做参数
                personBean.getClass().getClassLoader(),
                //代理需要实现的接口
                personBean.getClass().getInterfaces(),
                //将person传入调用处理器的构造器中,这正是处理器能够访问真实主题的原因
                new OwnerInvocationHandler(personBean));
        return (IPersonBean) o;
    }

    /**
     * 获取非拥有者类的代理对象
     * @param personBean 目标类接口
     * @return 代理类
     */
    public IPersonBean getNonOwnerProxy(IPersonBean personBean){
        Object o = Proxy.newProxyInstance(
                //目标类的类加载器当做参数
                personBean.getClass().getClassLoader(),
                //代理需要实现的接口
                personBean.getClass().getInterfaces(),
                //将person传入调用处理器的构造器中,这正是处理器能够访问真实主题的原因
                new NonOwnerInvocationHandler(personBean));
        return (IPersonBean) o;
    }


    /**
     * 统一方法
      * @param personBean 目标类接口
     * @param handler 处理器
     * @return 代理类
     */
    public IPersonBean getProxy(IPersonBean personBean, InvocationHandler handler){
        Object o = Proxy.newProxyInstance(
                //目标类的类加载器当做参数
                personBean.getClass().getClassLoader(),
                //代理需要实现的接口
                personBean.getClass().getInterfaces(),
                //将处理器传入代理类的构造器,不同的处理器可以实现不同的功能
                handler);
        return (IPersonBean) o;
    }
}
